package common;

/**
 * Semplice classe che fornisce un timer.
 * Mette a disposizione metodi per far partire(start()), resettare(reset()) e contollare lo stato del timer(outOfTime()).
 * 
 * 
 * 
 * @author Jacopo Ferrigno
 *
 */
public class Timer extends Thread
{
	
	private  final int checkRate = 1000;
	//Durata de timeOut
	private int waitTime;
	//Temp passato dallancio del timer
	private int elapsedTime;
	//Variabile per controllare se il timer sia andato fuori tempo.
	private boolean outOfTime=false;
	

	/**
	 * Crea un Timer che controlla il tempo specificato
	 * 
	 * @param wait tempo di attesa
	 */
	public Timer ( int wait )
	{
		super("Timer");
		this.setDaemon(true);
		this.waitTime = wait;
		this.elapsedTime = 0;
	}


	/**
	 * Resetta il timer e lo fa ripartire da 0;
	 * 
	 * 
	 */
	public synchronized void reset()
	{
		
		this.elapsedTime = 0;
	}

	/**
	 * Controlla se il timer sia esaurito o meno
	 * 
	 * @return true se il Timer si e' esaurito, false altrimenti
	 */
	public boolean outOfTime(){
		return this.outOfTime;
		
	}
	
	/**
	 * Chiude il timer 
	 * 
	 */
	public void close(){
		timeout();
		
	}
	
	public void run()
	{
		
		while(!outOfTime())
		{
			//mette il temer in sleep
			try
			{ 
				Thread.sleep(this.checkRate);
			}
			catch (InterruptedException ioe) 
			{
				continue;
			}

			
			synchronized ( this )
			{
				//Incrementa il tempo passato
				this.elapsedTime += this.checkRate;

				// Controlla se si e' superato il tempo di attesa
				if (this.elapsedTime> this.waitTime)
				{
					// lancia un timeout
					timeout();
				}
			}

		}
	}

	private void timeout(){
		this.outOfTime=true;
	}
	
	
	
	

}
